package com.weather.service;

import com.weather.domain.City;
import com.weather.dao.CityRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CityService {

    @Autowired
    private CityRepository cityRepository;

    // 注入RedisTemplate用于缓存操作
    @Autowired
    private RedisTemplate redisTemplate;

    // 城市信息缓存键前缀（避免与其他缓存键冲突）
    private static final String CITY_CACHE_PREFIX = "city_info_";

    // 获取前3条城市数据
    public List<City> getTop3Cities() {
        return cityRepository.findAll(PageRequest.of(0, 3)).getContent();
    }

    // 获取所有城市数据（用于定时全量更新）
    public List<City> getAllCities() {
        return cityRepository.findAll();
    }

    // 根据城市ID查询单个城市（添加缓存逻辑）
    public City getCityById(String cityId) {
        // 1. 构建缓存键（格式：city_info_城市ID）
        String cacheKey = CITY_CACHE_PREFIX + cityId;
        System.out.println("查询城市缓存键：" + cacheKey);

        // 2. 先从Redis查询缓存
        City city = (City) redisTemplate.opsForValue().get(cacheKey);
        if (city != null) {
            System.out.println("从Redis缓存获取城市信息：" + cityId + "，城市名称：" + city.getCity());
            return city; // 缓存命中，直接返回
        }

        // 3. 缓存未命中，查询数据库
        System.out.println("缓存未命中，开始查询数据库：城市ID=" + cityId);

        // 3.1 先查询所有城市（打印总数，确认数据库有数据）
        List<City> allCities = cityRepository.findAll();
        System.out.println("数据库中城市总数：" + allCities.size());

        // 3.2 过滤查询目标城市（处理可能的格式问题）
        city = allCities.stream()
                .filter(c -> {
                    // 去除两边空格后比较，避免格式差异导致匹配失败
                    String dbCityId = c.getCityId() != null ? c.getCityId().trim() : "";
                    String reqCityId = cityId != null ? cityId.trim() : "";
                    boolean isMatch = dbCityId.equals(reqCityId);
                    if (isMatch) {
                        System.out.println("数据库匹配到城市：" + c.getCity() + "（ID：" + dbCityId + "）");
                    }
                    return isMatch;
                })
                .findFirst()
                .orElse(null);

        // 4. 处理数据库查询结果
        if (city == null) {
            System.out.println("数据库未找到城市：" + cityId);
            return null;
        }
        System.out.println("数据库查询到城市：" + city.getCity() + "（ID：" + cityId + "）");

        // 5. 将城市信息存入Redis缓存
        try {
            redisTemplate.opsForValue().set(cacheKey, city);
            System.out.println("城市信息成功存入Redis缓存：" + cityId + "，缓存键：" + cacheKey);
        } catch (Exception e) {
            System.out.println("城市信息存入Redis失败：" + e.getMessage());
            e.printStackTrace(); // 打印完整异常堆栈，便于排查序列化或Redis连接问题
        }

        return city;
    }
}
